package array;

/**
 * @author: june
 * @date: 2023/8/11
 * @description: 605. 种花问题
 * 假设有一个很长的花坛，一部分地块种植了花，另一部分却没有。可是，花不能种植在相邻的地块上，它们会争夺水源，两者都会死去。
 * 给你一个整数数组 flowerbed 表示花坛，由若干 0 和 1 组成，其中 0 表示没种植花，1 表示种植了花。
 * 另有一个数 n ，能否在不打破种植规则的情况下种入 n 朵花？能则返回 true ，不能则返回 false 。
 **/

public class CanPlantFLowers_605 {
    /**
     * 在 flowerbed 数组两端各增加一个 0， 这样处理的好处在于不用考虑边界条件，任意位置处只要连续出现三个 0 就可以栽上一棵花。
     * 遇到边界难以处理的问题，可以考虑在扩充边界，使原来的边界成为非边界
     **/
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        int cnt = 0;
        int[] newFlowerBed = new int[flowerbed.length + 2];
        newFlowerBed[0] = 0;
        newFlowerBed[newFlowerBed.length - 1] = 0;
        for (int i = 0; i < flowerbed.length; i++) {
            newFlowerBed[i + 1] = flowerbed[i];
        }

        for (int i = 1; i < newFlowerBed.length - 1; i++) {
            if (newFlowerBed[i - 1] == 0 && newFlowerBed[i] == 0 && newFlowerBed[i + 1] == 0) {
                cnt++;
                // 如果满足条件就要置1，以免影响后面的判断
                newFlowerBed[i] = 1;
            }
        }
        return cnt >= n;
    }
}
